export function tree(arr) {
  const result = []
  const obj = {}
  arr.forEach(item => {
    obj[item.id] = item
  })
  arr.forEach(item => {
    // item.pid 为" "时 返回underfined
    const parent = obj[item.pid]
    if (parent) {
      (parent.children || (parent.children = [])).push(item)
    } else {
      // 这里push的item是pid为0的数据
      result.push(item)
    }
  })
  return result
}

// 方法二：(方法一的展开写法)
export function tree2(arr) {
  //   1.第一轮循环:
  // (1)给每一个arr中的对象补充children属性，直接赋值空数组
  // (2)建立一个字典(方便后期做查询)。{属性名是id:值就是对象}
  // 2.对arr做第二轮循环：
  // 根据 pid找父子关系
  // return结果
  const result = []
  const map = {}
  arr.forEach(item => {
    item.children = []
    map[item.id] = item
  })
  arr.forEach(item => {
    // 对于当前的元素，若它的pid对应的元素存在，说明它是下属，加入children的数组中，若找不到pid，说明它不是下属，是最外层的元素，则直接加入arr数组中
    const father = map[item.pid]
    if (father) {
      father.children.push(item)
    } else {
      result.push(item)
    }
  })
  return result
}

// 方法三：(递归)
export function tree3(data, pid = '') {
  var tree = []
  var temp
  for (var i = 0; i < data.length; i++) {
    // eslint-disable-next-line eqeqeq
    if (data[i].pid == pid) {
      var obj = data[i]
      temp = tree3(data, data[i].id)
      if (temp.length > 0) {
        obj.children = temp
      }
      tree.push(obj)
    }
  }
  return tree
}
